package online.inote.dic.security.core;

import java.security.NoSuchAlgorithmException;

import org.apache.commons.lang3.StringUtils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

import online.inote.dic.common.utils.DateTimeUtils;
import online.inote.dic.model.user.UserEntity;
import online.inote.dic.security.constants.Token;

/**
 * @description: Token管理
 * @author XQF.Sui
 * @created 2019年4月29日 下午9:08:05
 * @version 1.0
 */
public abstract class TokenManagement {
	
	/**
	 * @description 创建Token
	 * @author XQF.Sui
	 * @created 2019年4月29日 下午9:17:15
	 * @since 1.0
	 * @param user
	 * @return
	 * @throws NoSuchAlgorithmException 
	 * @throws JWTCreationException 
	 * @throws IllegalArgumentException 
	 */
	public static String generateToken(UserEntity user) {
		
//		Map<String, Object> headerMap = new HashMap<String, Object>();
//		headerMap.put("alg", "HS256");
//		headerMap.put("typ", "JWT");
		
		return JWT.create()
//		    	.withHeader(headerMap)												// 设置头部信息 Header
		    	.withClaim(Token.ClaimKey.USER_NAME, user.getUsername())			// 设置用户
		    	.withClaim(Token.ClaimKey.USER_PRIVATE_KEY, user.getPrivateKey())	// 设置用户私有KEY
		        .withIssuer(Token.DefaultInfo.ISSUER)								// 签名创建者
		        .withAudience(Token.DefaultInfo.AUDIENCE)							// 签名的受众
		        .withIssuedAt(DateTimeUtils.getNow()) 								// 签名的生成时间
		        .sign(Algorithm.HMAC256(user.getPassword()));						// 签名 Signature;
	}
	
	/**
	 * @description 获取用户账户信息
	 * @author XQF.Sui
	 * @created 2019年5月4日 下午6:04:14
	 * @param token
	 * @return
	 */
	public static String getUsername(String token) {
		DecodedJWT jwt = JWT.decode(token);
		
		Claim username = jwt.getClaim(Token.ClaimKey.USER_NAME);
		
		if (username == null || StringUtils.isBlank(username.asString())) {
			return null;
		}
		
		return username.asString();
	}
}